package gestorvideoclub;

import gestorvideoclub.enumeraciones.*;
import gestorvideoclub.jdbc.*;
import gestorvideoclub.util.*;
import java.util.*;

/**
 * Gestión de pedidos
 * 
 * @author MIGUEL_MAESTRE
 */
public class Pedido {

    // Atributos
    private int id; // Necesario en Contabilidad
    private Proveedor proveedor;
    private Date fechaPedido;
    private int numeroPedido;
    private EstadoPedido estado;
    private Collection<Producto> productos;

    // Métodos
    // Constructores
    public Pedido() {
        productos = new ArrayList();
    }

    public Pedido(Proveedor proveedor, Date fechaPedido, int numeroPedido, EstadoPedido estado, Collection<Producto> productos) {
        this.proveedor = proveedor;
        this.fechaPedido = fechaPedido;
        this.numeroPedido = numeroPedido;
        this.estado = estado;
        this.productos = productos;
    }

    // Funcionalidad
    /**
     * Recepción de un pedido
     *
     * El pedido puede ser recibido en su totalidad o bien parte de él.
     * Si un elemento se ha recibido, su estado queda como 'Disponible'
     * quedando el resto de sus elementos en estado 'Pedido'.
     * El pedido queda en estado 'Pendiente' si algún elemento no ha sido recibido
     * y en estado 'Recibido' en caso contrario
     */
    public void recepcionarPedido() {

        // TODO MIGUEL Premisa: los productos deben estar dados de alta en la BBDD previamente

        boolean recibido = true;
        int numProd;
        int codProd;
        Iterator it;
        Producto producto;

        do { // Pedir el número de productos recibidos
            System.out.print(">>> Número de productos recibidos: ");
            numProd = introduceDatos.introduceEntero();
        } while (numProd <= 0);

        for (int i = 1; i <= numProd; i++) { // Para cada producto recibido
            System.out.print(">>> Código de producto: ");
            codProd = introduceDatos.introduceEntero();

            it = this.productos.iterator();
            while (it.hasNext()) { // Recorrer la lista de productos
                producto = (Producto) it.next();
                if (codProd == producto.getCodigo()) { // Actualizar el estado del producto
                    producto.setEstado(ProductoEnum.Disponible);
                }
                it.next();
            }
        }

        // Comprobar estado de cada producto para ver si todos han sido recibidos
        // En casa afirmativo, cambiar estado del pedido de 'Pendiente' a 'Recibido'
        for (Producto p : this.productos) { // Recorrer la lista de productos
            if (p.getEstado() == ProductoEnum.Pedido) {
                recibido = false; // El pedido no está completo
            }
        }
        if (recibido){
            setEstado(EstadoPedido.Recibido); // Todos los elementos han sido recibidos
            System.out.println("[i] El pedido ha sido recibido en su totalidad.");
        }else{
            System.out.println("[i] Pedido actualizado. Quedan productos pendientes de recibir.");
        }
            

        PedidoJDBC.actualizaPedido(this); // Actualizar la BBDD
    }

    public void realizarPedido() {
        boolean terminar = false;
        int tipoProd = -1;      // Película o Videojuego
      //  int modalidad = -1;     // Nuevo, búsqueda código, nombre ...
        int intBool = -1;

        Pelicula pel = new Pelicula();
        Videojuego vid = new Videojuego();

        // TODO MIGUEL Buscar proveedor por nombre y de la lista resultante elegir o directamente por código
        // TODO MIGUEL Comprobar que el proveedor esté de alta
        // TODO MIGUEL Codigo de proveedor es el CIF ?

        System.out.print(">>> Código proveedor: ");     // Set proveedor
        setProveedor(ProveedorJDBC.obtenerProveedor(EntradaTextoStatic.leeCadena()));

        setFechaPedido(new Date());                     // Set fecha actual

        setNumeroPedido(PedidoJDBC.siguienteCodigo());  // Set código pedido

        setEstado(EstadoPedido.Pendiente);              // Set estado pedido

        do {
            tipoProd = seleccionProducto();
            if (tipoProd == 1) { // Insertar Película
                // modalidad = modalidadPedido();
                //  switch (modalidad) {
                //   case 1: // Buscar por código
                System.out.print(">>> Código película: ");
                pel = PeliculaJDBC.obtenerPeliculaPorId(EntradaTextoStatic.leeEntero());
                System.out.println(pel.getTitulo());
                productos.add(pel);
                //       break;
                //  case 2: // Buscar por parte del título
                //      break;
                //   default:
                //
                // }
            }
            if (tipoProd == 2) { // Insertar Videojuego
                //modalidad = modalidadPedido();
                //switch (modalidad) {
                //   case 1: // Buscar por código
                System.out.print(">>> Código videojuego: ");
                //int cod=EntradaTextoStatic.leeEntero();
                //                             System.out.print(">>> Código película: ");
                vid = VideojuegoJDBC.obtenerVideojuegoPorId(EntradaTextoStatic.leeEntero());
                System.out.println(vid.getTitulo());
                productos.add(vid);

                //    break;
                // case 2: // Buscar por parte del título
                //    break;
                // default:
                //
                // }
            }
            //modalidad = -1; // Reset modalidad

            System.out.print(">>> Terminar[1-No, 2-Sí]: ");
            intBool = EntradaTextoStatic.leeEntero();
            if (intBool == 2) {
                terminar = true;
            }
        } while (!terminar);

        // Insertar
        PedidoJDBC.insertarPedido(this);
    }

    // Métodos auxiliares
    private int seleccionProducto() {
        int tipoProd = -1;
        do {
            System.out.println(" [1] Película");
            System.out.println(" [2] Videojuego");
            System.out.print(">>> Seleccionar tipo: ");
            tipoProd = EntradaTextoStatic.leeEntero();
            if (tipoProd != 1 && tipoProd != 2) {
                System.out.print("[!] Opción no válida, inténtelo de nuevo");
                tipoProd = -1;
            }
        } while (tipoProd == -1);

        return tipoProd;
    }

    private int modalidadPedido() {
        int mod = -1;

        do {
            System.out.println(" [1] Buscar por código");
            System.out.println(" [2] Buscar por parte del título");
            System.out.print(">>> Seleccionar modalidad: ");
            mod = EntradaTextoStatic.leeEntero();
            if (mod < 1 || mod > 4) {
                System.out.println("[!] Opción no válida, inténtelo de nuevo");
                mod = -1;
            }
        } while (mod == -1);

        return mod;
    }

    @Override
    public String toString() {
        String cadListaProductos = "";

        for (Producto p : this.productos) {
            cadListaProductos = cadListaProductos + "\n" + p.toString();
        }

        String cad = "Proveedor: " + this.proveedor.getNombreEmpresa() + " (" + this.proveedor.getCIF() + ") "
                + "\n Fecha pedido: " + this.fechaPedido.toString()
                + "\n Estado: " + this.estado.toString()
                + "\n Lista de productos -------------------------------------"
                + cadListaProductos
                + "\n --------------------------------------------------------";
        return cad;
    }

    @Override
    public boolean equals(Object o) {
        boolean iguales = false;

        if (o instanceof Pedido) {
            Pedido p = (Pedido) o;
            if (this.proveedor.getCIF().equalsIgnoreCase(p.getProveedor().getCIF())
                    && this.estado.equals(p.getEstado())
                    && this.fechaPedido == p.getFechaPedido()
                    && this.productos.containsAll(p.getProductos())
                    && p.getProductos().containsAll(this.productos)) {
                iguales = true;
            }
        }
        return iguales;
    }

    @Override
    public int hashCode() {
        return 1;
    }

    // Get & Set
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public EstadoPedido getEstado() {
        return estado;


    }

    public void setEstado(EstadoPedido estado) {
        this.estado = estado;


    }

    public Date getFechaPedido() {
        return fechaPedido;


    }

    public void setFechaPedido(Date fechaPedido) {
        this.fechaPedido = fechaPedido;


    }

    public int getNumeroPedido() {
        return numeroPedido;


    }

    public void setNumeroPedido(int numeroPedido) {
        this.numeroPedido = numeroPedido;


    }

    public Collection<Producto> getProductos() {
        return productos;


    }

    public void setProductos(Collection<Producto> productos) {
        this.productos = productos;


    }

    public Proveedor getProveedor() {
        return proveedor;


    }

    public void setProveedor(Proveedor proveedor) {
        this.proveedor = proveedor;

    }
}
